import 'dart:math';

import 'package:flutter/material.dart';

/**
 * 父子、兄弟组件通信
 */
class WidgetContactDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Material(
        child: new Scaffold(
          appBar: new AppBar(
            title: new Text("组件间通信"),
          ),

          //主体
          body: new ParentWidget(),
        ));
  }
}

//父组件
class ParentWidget extends StatefulWidget {
  @override
  State createState() {
    return _ParentWidget();
  }
}

class _ParentWidget extends State<ParentWidget> {
  var bgColor; //父组件背景色
  var btnColor; //子组件背景色

  changeParentColor(color) {
    setState(() {
      bgColor = color;
    });
  }

  changeButtonColor() {
    setState(() {
      btnColor = RandomColor().get();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      width: MediaQuery.of(context).size.width,
      color: bgColor,
      child: Column(
        children: <Widget>[
          RaisedButton(
            onPressed: changeButtonColor,
            child: Text('Button1，点击修改button2背景色'),
          ),
          //这里把方法changeParentColor和变量btnColor传入MyButton，如果changeParentColor是无参函数，可以直接用MyButton(changeParentColor,btnColor),
          MyButton((c) => changeParentColor(c), btnColor),
        ],
      ),
    );
  }
}

//子组件按钮，需要传入一个点击事件callback和一个背景色btnColor，点击时会调用callback，而btnColor在外部修改的时候，子组件也会响应修改。
class MyButton extends StatefulWidget {
  Function callback;
  var btnColor;

  //dart构造函数，可以直接把传入参数赋值给相应变量
  MyButton(this.callback, this.btnColor);

  //下面这种写法的构造函数支持MyButton(callback:(c)=>changeParentColor(c),btnColor:btnColor),
//  MyButton({Key key,this.callback,this.btnColor}) : super(key:key) ;

  @override
  State createState() {
    return _MyButton();
  }
}

class _MyButton extends State<MyButton> {
  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      //State里可以通过widget访问其StatefulWidget里的变量，此处常见错误！不能写作widget.callback(Colors.black12)
      onPressed: () => widget.callback(RandomColor().get()),
      child: Text('Button2，点击修改父控件背景色'),
      color: widget.btnColor,
    );
  }
}

//随机颜色类
class RandomColor {
  final bgColors = [
    Colors.white,
    Colors.yellow,
    Colors.orange,
    Colors.cyan,
    Colors.lime,
    Colors.pinkAccent
  ];

  Color get() {
    return bgColors[Random.secure().nextInt(bgColors.length)];
  }
}